/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package manejadores;

import Manager.BDManager;
import entidates.*;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import utility.Globals;
//import modulo.ModuloPersona;


/**
 *
 * @author Overpower
 */
public final class ManejadorPersona extends Manejador{
    
    // propiedades 
    
    // contructores
    public ManejadorPersona(  )
    {
        try {
            ActualizarLista(BDManager.Get().Select("*", "persona", "alta=1"));
        } catch (SQLException ex) {
            Logger.getLogger(ManejadorPersona.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    // metodos
    @Override
    public String ValidarEntidad(IEntidad _object) {
        String _error = "";
        Persona _persona = (Persona) _object;
        
        // validar nombre
        if( !ValidarString(_persona.GetNombre()) )
        {
            _error += "Nombre Requerido."; 
        }
        
        // validar Apellido
        if( !ValidarString(_persona.GetApellido()) )
        {
            _error += "Apellido Requerido.";
        }
        
        // validar Documento
        Integer _dato = _persona.GetDocumento(); 
        if( null == _dato || _dato < 0  )
        {
            _error += "Documento Requerido.";
        }
        
        // validar legajo
        _dato = _persona.GetLegajo();
        if( null == _dato || _dato < 0 )
        {
            _error += "Legajo Requerido.";
        }
        
        // validar Fecha de nacimiento
        Date _date = _persona.GetFechaDeNacimiento();
        if( null == _date )
        {
            _error += "Fecha de Nacimiento Requerido.";
        }else{
            Date _now = new Date();
            if( _date.getTime() > _now.getTime() )
            {
                _error += "Fecha Incorrecta.";
            }
        }
        
        return _error;
    }

    @Override
    protected void ActualizarLista(ArrayList<HashMap<String, Object>> _ht) {
        if( null == _ht )
            return;
        
        _listaEntidades.clear();
        for (HashMap<String, Object> _registro : _ht) {
            Persona _p = new Persona();
            _p.SetID( (Integer)_registro.get("idPersona") );
            _p.SetTipoPersona((Integer)_registro.get("idTipoPersona"));
            _p.SetApellido( (String)_registro.get("apellido") );
            _p.SetNombre( (String)_registro.get("nombre") );
            _p.SetFechaDeNacimiento( new Date( ((java.sql.Date)_registro.get("fechaNac")).getTime() ) );
            _p.SetDocumento( (Integer)_registro.get("documento") );
            _p.SetLegajo((Integer)_registro.get("legajo"));
            
            _p.SetDomicilio( (String)_registro.get("domicilio") );
            _p.SetCiudad((String)_registro.get("ciudad") );
            _p.SetProvincia((String)_registro.get("provincia") );
            _p.SetTelefono((String)_registro.get("telefono"));
            _p.SetEmail((String)_registro.get("email") );
            _p.SetGenero((String)_registro.get("genero"));
            _p.SetNacionalidad( (String)_registro.get("nacionalidad"));
            
            _listaEntidades.add(_p);
        }
    }

    @Override
    public String Agregar_BD(IEntidad _entidad) {
        HashMap<String, String> _ht = GetHashMap(_entidad);
        return BDManager.Get().Insert("persona", _ht);
    }

    @Override
    public String Modificar_BD(IEntidad _entidad) {
        HashMap<String, String> _ht = GetHashMap(_entidad);
        return BDManager.Get().Update("persona", _ht, "idPersona="+((Persona)_entidad).GetID());
    }
    
    @Override
    public String Eliminar_BD(IEntidad _entidad) {
        Persona _p = (Persona)_entidad;
        HashMap<String, String> _ht = new HashMap<>();
        _ht.put("alta", "0");
        return BDManager.Get().Update("persona", _ht, "idPersona="+_p.GetID());
    }
    
    @Override
    public String Buscar(String _nombre, String _cadena, String _rango, Integer _offset, Integer _limit ) {
        String _err = "";
        
        try {
            String _filtro = "";
            
            // manejar algun nombre especial
            switch( _nombre )
            {
                case "DNI": _filtro = "documento"; break;
                default: _filtro = _nombre.toLowerCase(); break;
            }
            
            Boolean _isRange  = _rango != null;
            Boolean _hasLimit = _offset != null && _limit != null;
            String _where = "alta=1 AND " + _filtro;
            
            if( _isRange )
                _where += " BETWEEN '" + _cadena + "' AND '" + _rango + "'";
            else
                _where += " LIKE '" + _cadena + "%'";
            
            if( _hasLimit)
                _where += " LIMIT " + _offset + ", " + _limit;
            
            ActualizarLista( BDManager.Get().Select("*", "persona", _where) );
            
        } catch (SQLException ex) {
            _err = "Error en Busqueda. - " + ex.getMessage();
        }
        
        return _err;
    }

    @Override
    protected HashMap<String, String> GetHashMap(IEntidad _entidad) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        Persona _p = (Persona)_entidad;
        HashMap<String, String> _ht = new HashMap<>();
        //TODO: Vincular con tipo pérsona
        _ht.put("idTipoPersona", "0" );//_p.GetTipoPersona().toString() );
        _ht.put("nombre", _p.GetNombre());
        _ht.put("apellido", _p.GetApellido());
        _ht.put("fechaNac", Globals.GetFormatedDate(_p.GetFechaDeNacimiento() ));
        _ht.put("documento", _p.GetDocumento().toString());
        _ht.put("legajo", _p.GetLegajo().toString());
        _ht.put("domicilio", _p.GetDomicilio());
        _ht.put("ciudad", _p.GetCiudad());
        _ht.put("provincia", _p.GetProvincia());
        _ht.put("telefono", _p.GetTelefono());
        _ht.put("email", _p.GetEmail());
        _ht.put("genero", _p.GetGenero());
        _ht.put("nacionalidad", _p.GetNacionalidad());    
        
        return _ht;
    }
}
